package 进阶阶段;

import java.util.Objects;

/**
 * 创建人：刘源江
 * 类描述：
 * 创建时间：2022/7/30 11:19
 **/

public class demo01Object类 {
    public static void main(String[] args) {
        //Object类是所有类的父类
        //它里面写了所有子类应该具有的共同功能，为了让所有类都可以使用这些共同功能，所有类都直接或者间接的继承Object类
        //继承Object不写系统写

        //toString方法：对象在内存中看不见摸不着，所以提供方法，把对象变成带有地址值的字符串
        //equals方法：比较两个对象的地址值是否相等，相等返回true，否则返回false

        Teacher s1 = new Teacher();
        Teacher s2 = new Teacher();
        System.out.println(s1);//toString()不写系统写
        System.out.println(s1.toString());
        System.out.println(s1.equals(s2));
        System.out.println(s1 == s2);//对于引用数据类型， == 比较的是地址值

        Student s3 = new Student("宋祖儿" , 18);
        System.out.println("s3:" + s3.toString());//子类重写toString方法，打印实际的赋值

        Student s4 = new Student("宋祖儿" , 18);
        if (s3.equals(s4)){//下面的Student类中没有重写equals，则返回false，打印“不是同一个人”
            System.out.println("是同一个人");
        }else {
            System.out.println("不是同一个人");
        }

        //Objects工具类的静态方法equals方法的简单了解，只是利用短路优化了空指针异常，底层还是Object类的equals方法
        Student x1 = null;
        Student x2 = new Student("宋祖儿" , 18);
//        System.out.println(x1.equals(x2));//null表示没有地址值，没有地址值就找不到对象，更加无法使用对象里面的方法，用null去调用非静态方法运行报错
        System.out.println(Objects.equals(x1 , x2));//直接使用Objects.equals()进行比较，Student类中可以不用重写equals方法
    }
}

class Teacher{

}

class Student /* extends Object */{
    String name;
    int age;

    //如果内容值相等就返回true，需要打印内容值就要重写equals的方法，Alt+Insert快捷键选择equals and hashCode()
//    @Override
//    public boolean equals(Object o) {
//        if (this == o) return true;
//        if (o == null || getClass() != o.getClass()) return false;
//        Student student = (Student) o;
//        return age == student.age &&
//                Objects.equals(name, student.name);
//    }
//
//    @Override
//    public int hashCode() {
//
//        return Objects.hash(name, age);
//    }

    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
